package com.itheima.controller;

import com.alibaba.fastjson.JSON;
import com.itheima.bean.R;
import com.itheima.bean.User;
import com.itheima.service.UserService;
import com.itheima.utils.SMSUtils;
import com.itheima.utils.ValidateCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
public class UserController {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private UserService us;

    /**
     * 发送短信验证码
     * @param user
     * @return
     */
    @PostMapping("/user/sms")
    public R sendSMS(@RequestBody User user , HttpSession session){
        //1。得到手机号
        String phone = user.getPhone();

        //2、创造验证码 ，参数就是，生成的验证码有多少位数
        String code = ValidateCodeUtils.generateValidateCode4String(6);
        //把验证码输出到控制台，(用控制台来模仿接收到的短信验证码，然后我们后面再输入进去)
        System.out.println("code = " + code);

        //3、调用阿里云的短信API，给上面的手机号发送短信
        //【瑞吉外卖】您好，你通过了手机短信验证码登录，请在5分钟之内登录，验证码是：xxxxxx...
        //SMSUtils.sendMessage("瑞吉外卖","SMS_100088",phone,code);

        //4、把验证码保存起来
        //session.setAttribute("code",code);
        //把验证码保存起来，使用手机号作为key，验证码作为value
        //session.setAttribute(phone,code);

        //现在要把验证码保存到Redis里面去了，并且设置这个验证码的过期时间为5分钟
        //参数一： 尺寸到redis的KEY，参数二：存的值，其实就是验证码
        //参数三： 过期时间 5分钟    参数四：用来描述前面的5是什么时间，这里给的是分钟的单位
        redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);

        try {
            return R.success("验证码发送成功！");
        } catch (Exception e) {
            e.printStackTrace();
            return R.error("验证码发送失败！");
        }

    }

    /**
     * 登录
     * @param params
     * @return
     */
    @GetMapping("/user/login/{params}")
    public R login(@PathVariable String params,HttpSession session){
        //1、把参数转化成一个map集合
        //Map<String,String> map = new HashMap<String, String>();
        Map map = JSON.parseObject(params, Map.class);

        //2、获取页面传递过来的手机号和验证码
        String phone = (String) map.get("phone");
        String code = (String) map.get("code");
        System.out.println("phone = " + phone);
        System.out.println("code = " + code);

        //3、把刚才发送短信的验证码拿出来，和现在页面提交上来的验证码比较一下是否匹配
        //String saveCode = (String) session.getAttribute(phone);

        //现在要从Redis里面取出来验证码了
        String saveCode = (String) redisTemplate.opsForValue().get(phone);

        //3.1判定这个验证码是否匹配 ,细节1：注意验证码为空的情况
        if (code != null && code.equalsIgnoreCase(saveCode)){
            //3.2 先去查询数据库里面有没有这个用户存在？如果没有，就往数据库里面添加（其实就是完成注册的功能！）
            User user = us.findUser(phone);
            if (user == null){
                //3.3 需要把这个用户保存到数据库里面去，相当于是在背后完成这个用户的自动注册功能，把它的手机号保存到user表里面去。
                user = new User();
                user.setStatus(1);
                user.setPhone(phone);
                us.save(user);
                System.out.println("user.getId() = " + user.getId());
            }

            //3.3 把用户的手机号|id 保存到session作用域里面去，等一会在过滤器里面判定这个用户有没有登录，就凭这个来判定即可
            session.setAttribute("user",user);

            //登录成功，要记得把验证码给清除掉
            redisTemplate.delete(phone);

            return R.success("登录成功");
        } else {
            return R.error("登录失败");
        }
    }
}
